package com.hc.fdkforwarders.common.validation;

import com.hc.fdkforwarders.common.utils.StringUtils;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.regex.Pattern;

import static java.util.regex.Pattern.compile;

/**
 * @Description
 * @Author mengweibin
 * @Date 2021-07-12 14:04
 */
/**
 * Phone注解 校验器 实现
 * 验证器需要实现ConstraintValidator<U, V>, 其中 U为对应的注解类， V为被该注解标记的字段的类型(或其父类型)
 * <p>
 *
 * 注: 当项目启动后，会(懒加载)创建ConstraintValidator实例，在创建实例后会初始化调
 *     用{@link ConstraintValidator#initialize}方法。
 *     所以， 只有在第一次请求时，会走initialize方法， 后面的请求是不会走initialize方法的。
 *
 * 注: (懒加载)创建ConstraintValidator实例时， 会走缓存; 如果缓存中有，则直接使用相
 *     同的ConstraintValidator实例； 如果缓存中没有，那么会创建新的ConstraintValidator实例。
 *     由于缓存的key是能唯一定位的， 且 ConstraintValidator的实例属性只有在
 *     {@link ConstraintValidator#initialize}方法中才会写；在{@link ConstraintValidator#isValid}
 *     方法中只是读。
 *     所以不用担心线程安全问题。
 *
 */
public class PhoneValidator implements ConstraintValidator<Phone, String> {

    // 正则
    private Pattern pattern = compile("^1[3-9]\\d{9}$");

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {

        if (StringUtils.isEmpty(value)) {
            return false;
        }

        return pattern.matcher(value).matches();
    }
}
